/*
 * Created on 24/06/2005
 *
 */
package com.master.bd.calculo_frete ;

import java.sql.*;
import java.text.*;
import java.util.*;

import com.master.bd.*;
import com.master.ed.*;
import com.master.root.*;
import com.master.util.*;
import com.master.util.bd.*;
import com.master.util.ed.*;

public class Calcula_Servico   {

  public ExecutaSQL executasql;
  Utilitaria util = new Utilitaria(executasql);

    protected Movimento_ConhecimentoBD Movimento_ConhecimentoBD = null;
    protected Parametro_FixoED parametro_FixoED = new Parametro_FixoED();
    protected DecimalFormat dec = new DecimalFormat("###########0.00");

    protected String  SHORT_DATE = "dd/MM/yyyy";
    protected DateFormatter dateFormatter = new DateFormatter();

    protected String sql = null;
    protected String Tipo_Movimento;
    protected long valOid = 0;
    protected long oid_Taxa;
    protected String chave = null;
    protected long OID_Tipo_Movimento = 0;
    protected long oid_Cidade_Origem = 0;
    protected long oid_Cidade_Destino = 0;
    protected String Tipo_Taxa = null;
    protected double VL_Movimento_Frete = 0;
    protected double VL_Movimento;

    protected double VL_ISSQN = 0;
    protected double PE_Aliquota_ISSQN = 5;
    protected double VL_Servico = 0;

    protected String CD_CFO_CONHECIMENTO = "";

    protected ResultSet rs = null;
    protected ResultSet rsTabela = null;

    public Calcula_Servico(ExecutaSQL sql) {
      this.executasql = sql;
      util = new Utilitaria(this.executasql);
    }

    public ConhecimentoED calcula_servico(ConhecimentoED edConhec) throws Excecoes {

      // // ("  calcula_servico ");

        Calcula_FreteED ed = new Calcula_FreteED();

        ed = this.carregaParametros(edConhec);

        inicializaConhecimento(ed);

        ed = totalizaMovimento(ed);

        if (ed.getVL_Total_Frete() >0)
        {
            this.calculaISSQN(ed);
            ed = totalizaMovimento(ed);

            this.calculaTotalFrete(ed);

            this.totalizaConhecimento(ed);

            edConhec.setVL_Frete(ed.getVL_Total_Frete());
            edConhec.setVL_ISSQN(VL_ISSQN);
            edConhec.setCD_CFO("9999");
            edConhec.setCD_CFO_Conhecimento_Editado("9999");
        } else {
          Calcula_FreteED ed2 = new Calcula_FreteED();
          ed2.setOID_Conhecimento(ed.getOID_Conhecimento());
          ed2.setDM_Tipo_Calculo("N");
          ed2.setDM_Tipo_Tabela_Frete("N");
          ed2.setDM_ICMS_Contribuinte("N");
          edConhec.setVL_Frete(0);
          edConhec.setVL_ISSQN(0);
          edConhec.setCD_CFO("");
          edConhec.setCD_CFO_Conhecimento_Editado("");
          this.totalizaConhecimento(ed2);
        }

        return edConhec;
    }



    public Calcula_FreteED incluiMovimento( Calcula_FreteED ed) throws Excecoes {

        String sql = null;
        long OID_Tipo_Movimento = 0;
        String DM_Tipo_Movimento="";

        // // ("incluiMovimento=>>>" + Tipo_Movimento );

        double VL_Movimento=ed.getVL_Movimento();
        try{
            if (VL_Movimento>0) {
                sql =  " SELECT * FROM Tipos_Movimentos ";
                sql += " WHERE CD_Tipo_Movimento = '" + Tipo_Movimento + "'";

                ResultSet rs = null;
                rs = this.executasql.executarConsulta(sql);

                while (rs.next()){
                    OID_Tipo_Movimento = rs.getLong("OID_Tipo_Movimento");
                    DM_Tipo_Movimento = rs.getString("DM_Tipo_Movimento");
                    ed.setDM_Base_PIS_COFINS(rs.getString("DM_Base_PIS_COFINS"));
                }
                if ( ed.getOID_Tabela_Frete() != null && ed.getOID_Tabela_Frete().length()>0){
                  DM_Tipo_Movimento="G";
                }
                if (OID_Tipo_Movimento>0){
                    //calcula pis cofins
                    // // ("DM_Base_PIS_COFINS=" + ed.getDM_Base_PIS_COFINS() + "  DM_PIS_COFINS=" + ed.getDM_PIS_COFINS() +  "parametro_FixoED.getDM_Calcula_PIS_COFINS()=" + parametro_FixoED.getDM_Calcula_PIS_COFINS() + " PE_PIS_COFINS=" + ed.getPE_PIS_COFINS());


                    Movimento_ConhecimentoED edMovimento_Conhecimento = new Movimento_ConhecimentoED();

                    edMovimento_Conhecimento.setOID_Tipo_Movimento(OID_Tipo_Movimento);

                    edMovimento_Conhecimento.setVL_Movimento(Valor.round(VL_Movimento, 2));

                    edMovimento_Conhecimento.setDT_Movimento_Conhecimento(Data.getDataDMY());
                    edMovimento_Conhecimento.setHR_Movimento_Conhecimento(Data.getHoraHM());
                    edMovimento_Conhecimento.setOID_Conhecimento(ed.getOID_Conhecimento());

                    edMovimento_Conhecimento.setDM_Tipo_Movimento(DM_Tipo_Movimento);
                    edMovimento_Conhecimento.setDM_Lancado_Gerado("G");
                    edMovimento_Conhecimento.setOID_Tabela_Frete(ed.getOID_Tabela_Frete());

                    edMovimento_Conhecimento.setNM_Pessoa_Entrega("");

                    Movimento_ConhecimentoBD = new Movimento_ConhecimentoBD(this.executasql);

                    Movimento_ConhecimentoBD.inclui(edMovimento_Conhecimento);
                }

            }
            return ed;
        } catch(SQLException exc){
            throw new Excecoes(exc.getMessage(),exc, getClass().getName(), "gera movimento");
        }
    }


    protected Calcula_FreteED totalizaMovimento(Calcula_FreteED ed)
    throws Excecoes{
        try{

            VL_ISSQN =0;
            VL_Servico =0;


            sql = " SELECT * FROM Tipos_Movimentos, Movimentos_Conhecimentos " +
            " WHERE Movimentos_Conhecimentos.oid_Tipo_Movimento = Tipos_Movimentos.oid_Tipo_Movimento"+
            " AND Movimentos_Conhecimentos.OID_Conhecimento = '" + ed.getOID_Conhecimento() + "'";

            rs = this.executasql.executarConsulta(sql);

            while (rs.next()){
                // // (" totaliza_movimento " + rs.getString("DM_Totaliza"));


                if (rs.getString("DM_Totaliza").equals("Q")) {
                    VL_ISSQN = VL_ISSQN + rs.getDouble("VL_Movimento");
                }
                if (rs.getString("DM_Totaliza").equals("W")) {
                    VL_Servico = VL_Servico + rs.getDouble("VL_Movimento");
                }


            }

            ed.setVL_Total_Frete(VL_Servico );

            ed.setVL_Frete(ed.getVL_Total_Frete());

        } catch(SQLException e){
            throw new Excecoes(e.getMessage(), e, getClass().getName(), "totaliza_movimento(String OID_Conhecimento)");
        }
        return ed;
    }





    private void inicializaConhecimento(Calcula_FreteED ed) throws Excecoes {
        String sql = null;


        try{

            if (!"M".equals(ed.getDM_Tipo_Calculo())){
              sql = "delete from Movimentos_Conhecimentos WHERE oid_Conhecimento = ";
              sql += "('" + ed.getOID_Conhecimento() + "')";
              sql += " AND DM_Lancado_Gerado = 'G' ";
              executasql.executarUpdate(sql);
            }
            else {
              sql = "delete from Movimentos_Conhecimentos WHERE oid_Conhecimento = ";
              sql += "('" + ed.getOID_Conhecimento() + "')";
              sql += " AND oid_Tabela_Frete =''  AND DM_Lancado_Gerado = 'G' " ;
              executasql.executarUpdate(sql);
            }

            sql =  " UPDATE Conhecimentos SET ";
            sql += " VL_SERVICO = 0";
            sql += " ,VL_TOTAL_FRETE = 0";
            sql += " ,VL_ISSQN = 0";
            sql += " ,CD_CFO_CONHECIMENTO = '' ";
            sql += " ,DM_Tipo_Calculo = ''";
            sql += " WHERE OID_Conhecimento = '" + ed.getOID_Conhecimento() + "'" ;
      // // ("  inicializaConhecimento =" + sql);

            executasql.executarUpdate(sql);
        } catch (SQLException e) {
            throw new Excecoes(e.getMessage(), e, getClass().getName(), "inicializaConhecimento(Calcula_FreteED ed)");
        }
    }






    protected void totalizaConhecimento(Calcula_FreteED ed) throws Excecoes {
        try {
          int oid_taxa=0;
          sql =" Select oid_taxa FROM Taxas LIMIT 1";
          rs = this.executasql.executarConsulta (sql);
          while (rs.next ()) {
            oid_taxa=rs.getInt("oid_taxa");
          }


          sql =  " UPDATE Conhecimentos SET ";
          sql += "  VL_ISSQN = " + VL_ISSQN;
          sql += " ,VL_SERVICO = " + VL_Servico;
          sql += " ,VL_TOTAL_FRETE = " + VL_Servico;
          sql += " ,OID_TAXA = " + oid_taxa;
          sql += " ,CD_CFO_CONHECIMENTO = '" + CD_CFO_CONHECIMENTO + "'";
          sql += " WHERE OID_Conhecimento = '" + ed.getOID_Conhecimento() + "'" ;

          executasql.executarUpdate(sql);
        }

        catch(SQLException exc){
            throw new Excecoes(exc.getMessage(),exc, getClass().getName(), "calculaSeguro");
        }
    }




    protected void calculaISSQN(Calcula_FreteED ed) throws Excecoes {
        Tipo_Movimento = "ISQ";
        ed.setCD_Tipo_Movimento(Tipo_Movimento);
        ed.setVL_Movimento(((ed.getVL_Total_Frete() * PE_Aliquota_ISSQN)/100));
        this.incluiMovimento(ed);

    }

    protected void calculaTotalFrete(Calcula_FreteED ed) throws Excecoes {
        Tipo_Movimento = "TFS";

        ed = totalizaMovimento (ed);

        ed.setCD_Tipo_Movimento (Tipo_Movimento);
        ed.setVL_Movimento (ed.getVL_Total_Frete ());
        this.incluiMovimento (ed);
    }


    protected Calcula_FreteED carregaParametros(ConhecimentoED edConhec)
    throws Excecoes{
     Calcula_FreteED ed = new Calcula_FreteED ();
     ed.setOID_Pessoa_Pagador (edConhec.getOID_Pessoa_Pagador ());
     ed.setOID_Unidade (edConhec.getOID_Unidade ());
     ed.setOID_Conhecimento (edConhec.getOID_Conhecimento ());
     // //  ("ed.getOID_Cidade_Destino()=" + ed.getOID_Cidade_Destino () + " ISENCAO ICMS=" + ed.getDM_Isencao_ICMS ());
     return ed;
    }

}
